把 gradle build script 改成 KTS 之後,我們可以先確認一下現有的 project gradle 的版本,最好是要有 gradle 7 以上的版本。在 project 根目錄的地方找到 gradle/wrapper/gradle-wrapper.properties
裡面的 distributionUrl
確認版本號。
接著,到 :annotation
的 module 底下的 build.gradle.kts
加入 JVM plugin :
plugins {
kotlin("jvm")
// 略
}
:processor
的 module 也要加 JVM plugin 和 KSP 的 dependency :
plugins {
kotlin("jvm")
// 略
}
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0")
// 略
}
加完了 plugin 和 dependency 就要在使用 annotation 和 annotation processor 的地方,加上 KSP 的 plugin 和 dependency ,要加的 module 應該有 :processorTest
,如果你有其他地方也有做測試或是用到 processor 都要加。
plugins {
id("com.google.devtools.ksp") version "1.5.30-1.0.0"
// 略
}
dependencies {
ksp(project(":processor"))
// 略
}
到 settings.gradle.kts
那邊,加上 KSP plugin management 的宣告和指定 project 要拉的 repository 。
pluginManagement {
plugins {
id("com.google.devtools.ksp") version "1.5.30-1.0.0"
kotlin("jvm") version "1.5.30"
}
repositories {
gradlePluginPortal()
google()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
include(":kotlin", ":testCommon", ":processorTest", ":processor", ":annotation", ":android", ":app")
rootProject.name = "KtRssReader"
如果你有決心要把 KAPT 都改掉的話,要把 KAPT 的 dependencies 都刪乾淨。都改完了之後,記得要先 sync 一次 gradle 的 build !
在 :processor
module 底下建立新的 processor
class KspProcessor(
private val codeGenerator: CodeGenerator,
private val logger: KSPLogger,
private val options: Map<String, String>
): SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
logger.info("[testksp]")
val symbols = resolver
.getSymbolsWithAnnotation("tw.ktrssreader.annotation.RssTag")
.filterIsInstance<KSClassDeclaration>()
symbols.forEach { logger.info("[testksp] ${it.simpleName.getShortName()}") }
return emptyList()
}
}
我們先把有標註 @RssTag
的 class 名稱 log 出來。
然後在同一個 module 底下建立一個 processor provider
class KspProcessorProvider : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
return KspProcessor(
codeGenerator = environment.codeGenerator,
logger = environment.logger,
options = environment.options
)
}
}
最後一個步驟,要在 processor/src/main/resources/META_INF/servies
底下增加一個名為 com.google.devtools.ksp.processing.SymbolProcessorProvider
的檔案 (路徑跟之前使用的 AutoService 同路徑),檔案內容如下:
com.google.devtools.ksp.processing.SymbolProcessorProvider
上述步驟都完成之後,就可以 rebuild 一次 project 看看有什麼效果囉!如果沒有意外應該可以看到 IDE build output 的 log 有我們在 KspProcessor
寫的 log !